home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / esc.jar / com / extensibility / xml / DTDUtilities.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-06-30  |  8.7 KB  |  612 lines

  1. package com.extensibility.xml;
  2.  
  3. import com.extensibility.util.Debug;
  4. import com.extensibility.util.StringUtilities;
  5. import java.io.IOException;
  6. import java.util.Vector;
  7.  
  8. public final class DTDUtilities {
  9.    static Vector parseDecls(String var0) throws ParserException {
  10.       URI var1 = URI.makeStringURI(var0);
  11.       Schema var2 = new Schema(var1, DTDFlavor.NAME);
  12.  
  13.       try {
  14.          var2.parse(var1, var2.getCount(), (Object)null);
  15.       } catch (IOException var4) {
  16.          Debug.assert(var4);
  17.       }
  18.  
  19.       if (var2.parseErrors.size() >= 1) {
  20.          throw new ParserException(var2.parseErrors);
  21.       } else {
  22.          Debug.assert(var2.declarations.size() > 0, "neither a decl nor error was created");
  23.          return var2.declarations;
  24.       }
  25.    }
  26.  
  27.    public static int findMate(String var0, int var1) {
  28.       int var2 = 0;
  29.       if (var0.charAt(var1) == '(') {
  30.          for(; var1 < var0.length(); ++var1) {
  31.             if (var0.charAt(var1) == '(') {
  32.                ++var2;
  33.             } else if (var0.charAt(var1) == ')') {
  34.                --var2;
  35.                if (var2 == 0) {
  36.                   break;
  37.                }
  38.             }
  39.          }
  40.  
  41.          return var1;
  42.       } else {
  43.          for(; var1 >= 0; --var1) {
  44.             if (var0.charAt(var1) == ')') {
  45.                --var2;
  46.             } else if (var0.charAt(var1) == '(') {
  47.                ++var2;
  48.                if (var2 == 0) {
  49.                   break;
  50.                }
  51.             }
  52.          }
  53.  
  54.          return var1;
  55.       }
  56.    }
  57.  
  58.    public static boolean isInside(String var0, int var1, char var2, char var3) {
  59.       while(var1 >= 0) {
  60.          if (var0.charAt(var1) == var2) {
  61.             return true;
  62.          }
  63.  
  64.          if (var0.charAt(var1) == var3) {
  65.             return false;
  66.          }
  67.  
  68.          --var1;
  69.       }
  70.  
  71.       return false;
  72.    }
  73.  
  74.    public static int findTermStart(String var0, int var1) {
  75.       if (var1 < 0) {
  76.          var1 = 0;
  77.       }
  78.  
  79.       if (var1 >= var0.length()) {
  80.          if (var1 == 0) {
  81.             return -1;
  82.          }
  83.  
  84.          if (DTDParser.isConnectorChar(var0.charAt(var0.length() - 1))) {
  85.             return var1;
  86.          }
  87.  
  88.          var1 = var0.length() - 1;
  89.       }
  90.  
  91.       char var2 = var0.charAt(var1);
  92.       if (var2 != '(') {
  93.          if (var2 == ')') {
  94.             var1 = findMate(var0, var1);
  95.          } else if (var0.charAt(var1) == ContentModelTerm.TAG_TYPE_SEPARATOR || DTDParser.isNameChar(var0.charAt(var1)) && !isInside(var0, var1, '{', '}')) {
  96.             while(var1 >= 0 && (var0.charAt(var1) == ContentModelTerm.TAG_TYPE_SEPARATOR || DTDParser.isNameChar(var0.charAt(var1)))) {
  97.                --var1;
  98.             }
  99.  
  100.             ++var1;
  101.          } else {
  102.             --var1;
  103.  
  104.             while(var1 >= 0 && var0.charAt(var1) != ')' && !DTDParser.isNameChar(var0.charAt(var1)) && !DTDParser.isConnectorChar(var0.charAt(var1)) || isInside(var0, var1, '{', '}')) {
  105.                --var1;
  106.             }
  107.  
  108.             if (var1 >= 0) {
  109.                if (var0.charAt(var1) == ')') {
  110.                   var1 = findMate(var0, var1);
  111.                } else if (DTDParser.isConnectorChar(var0.charAt(var1))) {
  112.                   while(var1 < var0.length() && var0.charAt(var1) != '(' && !DTDParser.isNameChar(var0.charAt(var1))) {
  113.                      ++var1;
  114.                   }
  115.                } else if (var1 >= 0) {
  116.                   while(var1 >= 0 && (DTDParser.isNameChar(var0.charAt(var1)) || var0.charAt(var1) == ContentModelTerm.TAG_TYPE_SEPARATOR)) {
  117.                      --var1;
  118.                   }
  119.  
  120.                   ++var1;
  121.                }
  122.             }
  123.          }
  124.       }
  125.  
  126.       if (var1 < 0) {
  127.          var1 = 0;
  128.       } else if (var1 >= var0.length()) {
  129.          var1 = var0.length() - 1;
  130.       }
  131.  
  132.       return var1;
  133.    }
  134.  
  135.    public static String parseLocalTag(String var0, int var1) {
  136.       int var2;
  137.       for(var2 = var1; var2 < var0.length() && DTDParser.isNameChar(var0.charAt(var2)); ++var2) {
  138.       }
  139.  
  140.       return var2 < var0.length() && var0.charAt(var2) == ContentModelTerm.TAG_TYPE_SEPARATOR ? var0.substring(var1, var2) : null;
  141.    }
  142.  
  143.    public static String parseName(String var0, int var1) {
  144.       int var2;
  145.       for(var2 = var1; var2 < var0.length() && (DTDParser.isNameChar(var0.charAt(var2)) || var0.charAt(var2) == ContentModelTerm.TAG_TYPE_SEPARATOR); ++var2) {
  146.       }
  147.  
  148.       return var0.substring(var1, var2);
  149.    }
  150.  
  151.    public static String parseDigits(String var0, int var1) {
  152.       int var2;
  153.       for(var2 = var1; var2 < var0.length() && DTDParser.isDigitChar(var0.charAt(var2)); ++var2) {
  154.       }
  155.  
  156.       return var0.substring(var1, var2);
  157.    }
  158.  
  159.    public static int parseTerm(String var0, int var1, ContentModelTerm var2) {
  160.       boolean var3 = false;
  161.       if (var0.charAt(var1) == '(') {
  162.          var1 = findMate(var0, var1) + 1;
  163.          var2.updateModelTerm();
  164.       } else {
  165.          String var4 = parseLocalTag(var0, var1);
  166.          if (var4 != null) {
  167.             var1 += var4.length() + 1;
  168.          }
  169.  
  170.          String var5 = parseName(var0, var1);
  171.          var1 += var5.length();
  172.          var2.updateModelTerm(new TypeRef(var5));
  173.          var2.setLocalTag(var4);
  174.       }
  175.  
  176.       int[] var10 = new int[2];
  177.  
  178.       try {
  179.          var1 = parseOccurance(var0, var1, var10);
  180.          var2.setOccurance(var10[0], var10[1]);
  181.          var1 = StringUtilities.skipWhite(var0, var1);
  182.          if (var1 < var0.length() && DTDParser.isConnectorChar(var0.charAt(var1))) {
  183.             var2.setConnection(var0.charAt(var1));
  184.             var1 = StringUtilities.skipWhite(var0, var1 + 1);
  185.          } else {
  186.             var2.setConnection(',');
  187.          }
  188.       } catch (IllegalArgumentException var6) {
  189.          while(var1 < var0.length() && !DTDParser.isNameChar(var0.charAt(var1)) && var0.charAt(var1) != ')') {
  190.             ++var1;
  191.          }
  192.  
  193.          if (var1 < var0.length() && isInside(var0, var1, '{', '}') || var0.charAt(var1) == '{') {
  194.             do {
  195.                ++var1;
  196.             } while(var1 < var0.length() && var0.charAt(var1) != '}');
  197.          }
  198.       }
  199.  
  200.       var1 = StringUtilities.skipWhite(var0, var1);
  201.       return var1;
  202.    }
  203.  
  204.    public static int parseOccurance(String var0, int var1, int[] var2) throws IllegalArgumentException {
  205.       var2[0] = 1;
  206.       var2[1] = 1;
  207.       var1 = StringUtilities.skipWhite(var0, var1);
  208.       if (var1 >= var0.length()) {
  209.          return var1;
  210.       } else {
  211.          char var3 = var0.charAt(var1);
  212.          if (DTDParser.isOccuranceChar(var3)) {
  213.             if (var3 == '?') {
  214.                var2[0] = 0;
  215.             } else if (var3 == '+') {
  216.                var2[1] = Integer.MAX_VALUE;
  217.             } else if (var3 == '*') {
  218.                var2[0] = 0;
  219.                var2[1] = Integer.MAX_VALUE;
  220.             }
  221.  
  222.             var1 = StringUtilities.skipWhite(var0, var1 + 1);
  223.          } else if (var3 == '{') {
  224.             var1 = StringUtilities.skipWhite(var0, var1 + 1);
  225.             String var4 = parseDigits(var0, var1);
  226.             var1 += var4.length();
  227.             var2[0] = Integer.parseInt(var4);
  228.             var1 = StringUtilities.skipWhite(var0, var1);
  229.             if (var0.charAt(var1) != ',') {
  230.                throw new IllegalArgumentException("expected ','");
  231.             }
  232.  
  233.             var1 = StringUtilities.skipWhite(var0, var1 + 1);
  234.             if (var0.charAt(var1) == '*') {
  235.                var2[1] = Integer.MAX_VALUE;
  236.                ++var1;
  237.             } else {
  238.                String var5 = parseDigits(var0, var1);
  239.                var1 += var5.length();
  240.                var2[1] = Integer.parseInt(var5);
  241.             }
  242.  
  243.             var1 = StringUtilities.skipWhite(var0, var1);
  244.             if (var0.charAt(var1) != '}') {
  245.                throw new IllegalArgumentException("expected '}'");
  246.             }
  247.  
  248.             var1 = StringUtilities.skipWhite(var0, var1 + 1);
  249.          }
  250.  
  251.          return var1;
  252.       }
  253.    }
  254.  
  255.    public static int parseSourceOccurance(String var0, int var1, int[] var2) throws IllegalArgumentException {
  256.       var2[0] = 1;
  257.       var2[1] = 1;
  258.       var1 = StringUtilities.skipWhite(var0, var1);
  259.       if (var1 >= var0.length()) {
  260.          return var1;
  261.       } else {
  262.          char var3 = var0.charAt(var1);
  263.          if (DTDParser.isOccuranceChar(var3)) {
  264.             if (var3 == '?') {
  265.                var2[0] = 0;
  266.             } else if (var3 == '+') {
  267.                var2[1] = Integer.MAX_VALUE;
  268.             } else if (var3 == '*') {
  269.                var2[0] = 0;
  270.                var2[1] = Integer.MAX_VALUE;
  271.             }
  272.  
  273.             var1 = StringUtilities.skipWhite(var0, var1 + 1);
  274.          } else {
  275.             var1 = StringUtilities.skipWhite(var0, var1);
  276.             String var4 = parseDigits(var0, var1);
  277.             var1 += var4.length();
  278.             var2[0] = Integer.parseInt(var4);
  279.             var1 = StringUtilities.skipWhite(var0, var1);
  280.             if (var0.charAt(var1) != ',') {
  281.                throw new IllegalArgumentException("expected ','");
  282.             }
  283.  
  284.             var1 = StringUtilities.skipWhite(var0, var1 + 1);
  285.             if (var0.charAt(var1) == '*') {
  286.                var2[1] = Integer.MAX_VALUE;
  287.                ++var1;
  288.             } else {
  289.                String var5 = parseDigits(var0, var1);
  290.                var1 += var5.length();
  291.                var2[1] = Integer.parseInt(var5);
  292.             }
  293.  
  294.             var1 = StringUtilities.skipWhite(var0, var1);
  295.          }
  296.  
  297.          return var1;
  298.       }
  299.    }
  300.  
  301.    static BaseDeclaration parseDecl(String var0) throws ParserException {
  302.       URI var1 = URI.makeStringURI(var0);
  303.       Schema var2 = new Schema(var1, DTDFlavor.NAME);
  304.  
  305.       try {
  306.          var2.parse(var1, var2.getCount(), (Object)null);
  307.       } catch (IOException var4) {
  308.          Debug.assert(var4);
  309.       }
  310.  
  311.       if (var2.declarations.size() > 1) {
  312.          var2.addError(new ParserException(200, (new Integer(var2.declarations.size())).toString()));
  313.       }
  314.  
  315.       if (var2.parseErrors.size() >= 1) {
  316.          throw new ParserException(var2.parseErrors);
  317.       } else {
  318.          Debug.assert(var2.declarations.size() > 0, "neither a decl nor error was created");
  319.          return (BaseDeclaration)var2.declarations.elementAt(0);
  320.       }
  321.    }
  322.  
  323.    public static boolean boundedByParens(String var0) {
  324.       int var1 = 0;
  325.       boolean var2 = true;
  326.       boolean var3 = false;
  327.  
  328.       for(int var4 = 0; var4 < var0.length(); ++var4) {
  329.          char var5 = var0.charAt(var4);
  330.          if (var5 == '(') {
  331.             ++var1;
  332.             if (var3) {
  333.                return false;
  334.             }
  335.  
  336.             var2 = false;
  337.          } else if (var5 == ')') {
  338.             --var1;
  339.             if (var1 == 0) {
  340.                var3 = true;
  341.             }
  342.          } else if (!DTDParser.isOccuranceChar(var5) && !DTDParser.isWhiteChar(var5)) {
  343.             if (var3 && var5 == '{') {
  344.                while(var4 < var0.length() && var0.charAt(var4) != '}') {
  345.                   ++var4;
  346.                }
  347.  
  348.                if (var4 == var0.length()) {
  349.                   return false;
  350.                }
  351.             } else if (var2 || var3) {
  352.                return false;
  353.             }
  354.          }
  355.       }
  356.  
  357.       return true;
  358.    }
  359.  
  360.    public static String extractPrefix(String var0) {
  361.       int var1 = var0.indexOf(58);
  362.       return var1 == -1 ? "" : var0.substring(0, var1);
  363.    }
  364.  
  365.    public static String extractUnqualifiedName(String var0) {
  366.       int var1 = var0.indexOf(58);
  367.       return var1 == -1 ? var0 : var0.substring(var1 + 1);
  368.    }
  369.  
  370.    public static String generateValidName(String var0) {
  371.       StringBuffer var1 = new StringBuffer();
  372.       if (var0.length() == 0 || !DTDParser.isNameStartChar(var0.charAt(0))) {
  373.          var1.append("xa_");
  374.       }
  375.  
  376.       for(int var2 = 0; var2 < var0.length(); ++var2) {
  377.          char var3 = var0.charAt(var2);
  378.          if (DTDParser.isNameChar(var3)) {
  379.             var1.append(var3);
  380.          } else {
  381.             var1.append('_');
  382.          }
  383.       }
  384.  
  385.       return var1.toString();
  386.    }
  387.  
  388.    public static String makeValidName(String var0) {
  389.       StringBuffer var1 = new StringBuffer();
  390.       boolean var2 = false;
  391.  
  392.       for(int var3 = 0; var3 < var0.length(); ++var3) {
  393.          if (!var2) {
  394.             if (DTDParser.isNameStartChar(var0.charAt(var3))) {
  395.                var1.append(var0.charAt(var3));
  396.                var2 = true;
  397.             }
  398.          } else if (DTDParser.isNameChar(var0.charAt(var3))) {
  399.             var1.append(var0.charAt(var3));
  400.          }
  401.       }
  402.  
  403.       if (var1.length() == 0) {
  404.          return makeValidName(String.valueOf("_").concat(String.valueOf(var0)));
  405.       } else {
  406.          return var1.toString();
  407.       }
  408.    }
  409.  
  410.    public static boolean isPEReference(String var0) {
  411.       return var0.length() > 0 && var0.charAt(0) == '%';
  412.    }
  413.  
  414.    public static boolean isPEName(String var0) {
  415.       return var0.length() > 0 && var0.charAt(0) == '%';
  416.    }
  417.  
  418.    public static boolean isGEName(String var0) {
  419.       return var0.length() > 0 && var0.charAt(0) == '&';
  420.    }
  421.  
  422.    public static boolean isValidName(String var0) {
  423.       if (var0.length() == 0) {
  424.          return false;
  425.       } else if (!DTDParser.isNameStartChar(var0.charAt(0))) {
  426.          return false;
  427.       } else {
  428.          for(int var1 = 1; var1 < var0.length(); ++var1) {
  429.             var0.charAt(var1);
  430.             if (!DTDParser.isNameChar(var0.charAt(var1))) {
  431.                return false;
  432.             }
  433.          }
  434.  
  435.          return true;
  436.       }
  437.    }
  438.  
  439.    public static Vector extractNames(String var0, char var1) {
  440.       Vector var2 = new Vector();
  441.       boolean var3 = false;
  442.       int var4 = 0;
  443.  
  444.       for(int var5 = var0.indexOf(var1, var4); var5 >= 0; var5 = var0.indexOf(var1, var4)) {
  445.          for(var4 = var5 + 1; var4 < var0.length() && DTDParser.isNameChar(var0.charAt(var4)); ++var4) {
  446.          }
  447.  
  448.          var2.addElement(var0.substring(var5 + 1, var4));
  449.       }
  450.  
  451.       return var2;
  452.    }
  453.  
  454.    public static Vector extractNames(String var0) {
  455.       Vector var2 = new Vector();
  456.       int var3 = -1;
  457.  
  458.       for(int var4 = 0; var4 < var0.length(); ++var4) {
  459.          char var5 = var0.charAt(var4);
  460.          if (DTDParser.isNameChar(var5)) {
  461.             if (var3 == -1) {
  462.                var3 = var4;
  463.                if (var4 > 0 && "#%&".indexOf(var0.charAt(var4 - 1)) >= 0) {
  464.                   var3 = var4 - 1;
  465.                }
  466.             }
  467.          } else if (var3 >= 0) {
  468.             var2.addElement(var0.substring(var3, var4));
  469.             var3 = -1;
  470.          }
  471.       }
  472.  
  473.       if (var3 >= 0) {
  474.          var2.addElement(var0.substring(var3));
  475.       }
  476.  
  477.       return var2;
  478.    }
  479.  
  480.    public static String extractName(String var0, int var1) {
  481.       int var4 = var0.length();
  482.       if (var1 < var4 && var1 >= 0) {
  483.          int var3;
  484.          for(var3 = var1; var3 < var4; ++var3) {
  485.             char var5 = var0.charAt(var3);
  486.             if (!DTDParser.isNameChar(var5)) {
  487.                break;
  488.             }
  489.          }
  490.  
  491.          int var2;
  492.          for(var2 = var1; var2 >= 0; --var2) {
  493.             char var7 = var0.charAt(var2);
  494.             if (!DTDParser.isNameChar(var7)) {
  495.                if (var7 == '&' || var7 == '%') {
  496.                   --var2;
  497.                }
  498.                break;
  499.             }
  500.          }
  501.  
  502.          ++var2;
  503.          return var2 >= var3 ? null : var0.substring(var2, var3);
  504.       } else {
  505.          return null;
  506.       }
  507.    }
  508.  
  509.    public static String convertGEName(String var0, boolean var1) {
  510.       if (var1) {
  511.          return var0.charAt(0) == '&' ? var0 : String.valueOf('&').concat(String.valueOf(var0));
  512.       } else {
  513.          return var0.charAt(0) != '&' ? var0 : var0.substring(1);
  514.       }
  515.    }
  516.  
  517.    public static String convertPEName(String var0, boolean var1) {
  518.       if (var1) {
  519.          return var0.charAt(0) == '%' ? var0 : String.valueOf('%').concat(String.valueOf(var0));
  520.       } else {
  521.          String var2;
  522.          if (var0.charAt(0) != '%') {
  523.             var2 = var0;
  524.          } else {
  525.             var2 = var0.substring(1);
  526.          }
  527.  
  528.          if (var2.charAt(var2.length() - 1) == ';') {
  529.             var2 = var2.substring(0, var2.length() - 1);
  530.          }
  531.  
  532.          return var2;
  533.       }
  534.    }
  535.  
  536.    public static String convertPEReferences(String var0, boolean var1) {
  537.       if (var0 == null) {
  538.          return "";
  539.       } else if (var0.indexOf(37) == -1) {
  540.          return var0;
  541.       } else {
  542.          StringBuffer var2 = new StringBuffer();
  543.          byte var3 = 0;
  544.          int var4 = 0;
  545.          int var5 = 0;
  546.          if (var1) {
  547.             for(int var6 = var0.indexOf(37, var3); var6 >= 0; var6 = var0.indexOf(37, var4)) {
  548.                for(var4 = var6 + 1; var4 < var0.length() && DTDParser.isNameChar(var0.charAt(var4)); ++var4) {
  549.                }
  550.  
  551.                var2.append(var0.substring(var5, var4));
  552.                if (var4 == var0.length() || var0.charAt(var4) != ';') {
  553.                   var2.append(";");
  554.                }
  555.  
  556.                var5 = var4;
  557.             }
  558.  
  559.             var2.append(var0.substring(var4));
  560.          } else {
  561.             for(int var7 = var0.indexOf(37, var3); var7 >= 0; var7 = var0.indexOf(37, var4)) {
  562.                for(var4 = var7 + 1; var4 < var0.length() && DTDParser.isNameChar(var0.charAt(var4)); ++var4) {
  563.                }
  564.  
  565.                var2.append(var0.substring(var5, var4));
  566.                if (var4 < var0.length() && var0.charAt(var4) == ';') {
  567.                   ++var4;
  568.                }
  569.  
  570.                var5 = var4;
  571.             }
  572.  
  573.             var2.append(var0.substring(var4));
  574.          }
  575.  
  576.          return var2.toString();
  577.       }
  578.    }
  579.  
  580.    public static Vector parseNameList(String var0, char var1) throws ParserException {
  581.       Vector var2 = new Vector();
  582.       int var3 = var0.length();
  583.       int var4 = -1;
  584.  
  585.       for(int var5 = 0; var5 < var3; ++var5) {
  586.          char var6 = var0.charAt(var5);
  587.          if (DTDParser.isNameChar(var6)) {
  588.             if (var4 == -1) {
  589.                var4 = var5;
  590.             }
  591.          } else if (var6 == '%' && var4 == -1) {
  592.             var4 = var5;
  593.          } else {
  594.             if (var4 > -1) {
  595.                var2.addElement(var0.substring(var4, var5));
  596.                var4 = -1;
  597.             }
  598.  
  599.             if (var6 != var1 && !DTDParser.isWhiteChar(var6)) {
  600.                throw new ParserException(201, var0.substring(0, var5 + 1));
  601.             }
  602.          }
  603.       }
  604.  
  605.       if (var4 > -1) {
  606.          var2.addElement(var0.substring(var4, var3));
  607.       }
  608.  
  609.       return var2;
  610.    }
  611. }
  612.